package rohyunji;

public class J26_TypeCasting {

	// 모든 클래스의 조상 Object (java.lang.Object (궁극의 Super))
	// extends Object 라고 명시되어 있지않아도 Object를 상속받고있다.
	// 기본적으로 Object 클래스에는 7개의 메서드가 정의 되어있고 하위클래스(우리가 쓰는 클래스)에서 이것을
	// 재정의 해서 적절히 사용하는것이다.

	// equals(기존객체와 매개변수로 전달된 객체와 비교,객체비교가 제대로 이뤄질려면 메서드를 재정의,구현)

	// hashcode(객체의 해시코드를 출력)
	// 객체는 일반적으로 heap에생성됨 heap생성된 객체의 메모지주소를 바탕으로
	// 만들어지는 유일한 코드값을 의미한다.

	// toString (객체에 대한 설명을 출력 )

	public static void main(String[] args) {

		Object obj = new Object();// F3

		J26_Animal a = new J26_Animal();
		J26_Fish f = new J26_Fish();
		a = new J26_Fish(); // fish는 animal 확장했기때문에 animal객체에 fish객체 받을수있음
		// 하위 개체를 상위 객체로 cast하는 경우 이것을 upcasting
		// f=(J26_Fish)new J26_Animal();
		// 상위 객체를 하위객체로 downcasting 하는 경우 이때는 명시적형변환

		// 스타크래프트 게임내에서 해병,불곰,의무병 생성하는 경우
		 Marrine m=new Marrine();
		// Firebat fb=new Firebat();
		// Medic md=new Medic();

		// 다형성을 근거로 테란유닛 생산 (upcasting) 즉 Marrine 유닛은 상황에따라 TerranUnit도 될수 있다는
		// 의미
		 TerranUnit d=new TerranUnit();
		 d.sayUnit(m);

		TerranUnit t1 = new Marrine();
		t1.sayUnit();
		t1.sayUnit((Marrine)t1);
		TerranUnit t2=new Firebat();
		t2.sayUnit();
		t2.sayUnit((Firebat)t2);
		TerranUnit t3=new Medic();
		t3.sayUnit();
	
		AllianceUnit a1=new Human();
		AllianceUnit a2=new Wolf();
		AllianceUnit a3=new Nom();
		
		//특정객체가 어떤유형과 동일한지 또는 상속관계인지 알아볼때 
		// instanceof 예약어 사용
		J26_TypeCasting t =new J26_TypeCasting();
		if(t instanceof java.lang.Object)
			System.out.println("t는 Object자손");
		if (m instanceof TerranUnit)
			System.out.println("해병은 테란유닛의 자손");
		if (m instanceof Marrine)
			System.out.println("m은 해병");
	}

}

// TerranUnit-Marrine,Firebat,Medic

class TerranUnit {
	public void sayUnit() {
		System.out.println("저는 테란 유닛입니다.");
	}
	public void sayUnit(Marrine m) {
		System.out.println("나는 Marrine.!!^^");
	}
	public void sayUnit(Firebat m) {
		System.out.println("나는  Firebat.");
	}
	public void sayUnit(Medic m) {
		System.out.println("나는 Medic.");
	}
}

class Marrine extends TerranUnit {

	public void sayUnit(Marrine m) {
		super.sayUnit(this);
		System.out.println("ㅎㅎㅎ");
	}
}

class Firebat extends TerranUnit {
	
}

class Medic extends TerranUnit {

}

class AllianceUnit {
}

class Human extends AllianceUnit {
}

class Wolf extends AllianceUnit {
}

class Nom extends AllianceUnit {
}
